package com.education.ai.service.impl;

import com.education.ai.service.QwenService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * 千问大模型服务实现类
 */
@Slf4j
@Service
public class QwenServiceImpl implements QwenService {

    @Value("${tongyi.qwen.api.key:your-api-key-here}")
    private String apiKey;

    @Value("${tongyi.qwen.api.uri:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation}")
    private String apiUri;

    @Value("${tongyi.qwen.api.model:qwen-max}")
    private String model;
    
    private final boolean mockMode;
    
    private final RestTemplate restTemplate = new RestTemplate();
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    public QwenServiceImpl() {
        this.mockMode = true; // 默认使用模拟模式
    }

    @Override
    //生成课程计划
    public String generateLessonPlan(String subject, String grade, String topic) {
        if (mockMode) {
            // 模拟模式返回固定内容
            return String.format(
                "# %s年级%s课程 - %s 教学计划\n\n" +
                "## 教学目标\n" +
                "1. 掌握%s的基本概念\n" +
                "2. 理解%s的核心原理\n" +
                "3. 能够应用所学知识解决相关问题\n\n" +
                "## 教学内容\n" +
                "1. %s概述\n" +
                "2. %s的重要性\n" +
                "3. %s的应用场景\n\n" +
                "## 教学活动安排\n" +
                "1. 导入活动（10分钟）\n" +
                "2. 讲解与示范（20分钟）\n" +
                "3. 小组讨论（10分钟）\n" +
                "4. 总结与反馈（5分钟）\n\n" +
                "## 教学资源建议\n" +
                "1. %s相关教材\n" +
                "2. 多媒体课件\n" +
                "3. 实践案例材料\n\n" +
                "## 评估方式\n" +
                "1. 课堂参与度评价\n" +
                "2. 小组合作表现\n" +
                "3. 课后作业完成情况",
                grade, subject, topic, topic, topic, topic, topic, topic, topic
            );
        }
        
        String prompt = String.format(
                "请你作为一名资深的%s学科教师，为%s学生制作一份关于《%s》的详细教案。"
                + "教案需要包含以下部分：\n"
                + "1. 教学目标\n"
                + "2. 教学重点难点\n"
                + "3. 教学过程（包括导入、新课讲解、练习、总结等环节）\n"
                + "4. 板书设计\n"
                + "5. 课后作业\n"
                + "请确保教案内容符合学生认知水平，教学方法多样，重点突出。",
                subject, grade, topic);

        return generateContent(prompt);
    }

    @Override
    //生成练习
    public String generateExercises(String subject, String grade, String topic, int count) {
        if (mockMode) {
            // 模拟模式返回固定内容
            return String.format(
                "# %s %s年级 %s 练习题（%d道）\n\n" +
                "## 选择题\n" +
                "1. 关于%s的描述，正确的是：\n" +
                "   A. 选项A\n" +
                "   B. 选项B\n" +
                "   C. 选项C\n" +
                "   D. 选项D\n\n" +
                "2. 下列哪个不是%s的特点：\n" +
                "   A. 特点A\n" +
                "   B. 特点B\n" +
                "   C. 特点C\n" +
                "   D. 特点D\n\n" +
                "## 填空题\n" +
                "1. %s的主要应用领域包括______和______。\n" +
                "2. %s的核心原理是______。\n\n" +
                "## 简答题\n" +
                "1. 简述%s的发展历程。\n" +
                "2. 分析%s在实际应用中的优势和局限性。",
                subject, grade, topic, count, topic, topic, topic, topic, topic, topic
            );
        }
        
        String prompt = String.format(
                "请你作为一名资深的%s学科教师，为%s学生制作%d道关于《%s》的练习题。"
                + "题目类型包括选择题、填空题和解答题，并提供参考答案和解析。"
                + "请确保题目难度适中，覆盖知识点全面，由浅入深，有利于学生掌握相关知识。",
                subject, grade, count, topic);

        return generateContent(prompt);
    }

    @Override
    public String generateContent(String prompt) {
        if (mockMode) {
            // 模拟模式返回提示信息
            return "模拟模式下生成的内容：" + prompt.substring(0, Math.min(50, prompt.length())) + "...";
        }
        
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.set("Authorization", "Bearer " + apiKey);

            Map<String, Object> requestBody = new HashMap<>();
            Map<String, Object> input = new HashMap<>();
            Map<String, Object> parameters = new HashMap<>();
            
            input.put("prompt", prompt);
            parameters.put("model", model);
            parameters.put("result_format", "text");
            parameters.put("temperature", 0.7);
            parameters.put("max_tokens", 2000);
            
            requestBody.put("input", input);
            requestBody.put("parameters", parameters);

            HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);
            ResponseEntity<String> response = restTemplate.postForEntity(apiUri, request, String.class);

            JsonNode responseJson = objectMapper.readTree(response.getBody());
            String generatedContent = responseJson.path("output").path("text").asText();

            return generatedContent;
        } catch (Exception e) {
            log.error("千问大模型API调用失败", e);
            return "AI内容生成失败，请稍后重试。";
        }
    }
} 